<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 4.0.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">
  <link rel="alternate" href="/atom.xml" title="dy2903的博客" type="application/atom+xml">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">


<script id="hexo-configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    version: '7.5.0',
    exturl: false,
    sidebar: {"position":"left","display":"post","offset":12,"onmobile":false},
    copycode: {"enable":false,"show_result":false,"style":null},
    back2top: {"enable":true,"sidebar":false,"scrollpercent":false},
    bookmark: {"enable":false,"color":"#222","save":"auto"},
    fancybox: false,
    mediumzoom: false,
    lazyload: false,
    pangu: false,
    algolia: {
      appID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    },
    localsearch: {"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},
    path: '',
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    translation: {
      copy_button: 'Copy',
      copy_success: 'Copied',
      copy_failure: 'Copy failed'
    },
    sidebarPadding: 40
  };
</script>

  <meta name="description" content="数据容灾 数据备份系统只能保证实际上被安全复制了一份，如果生产系统故障，必须将备份数据尽快的恢复到生产系统中继续生产，就叫容灾。  容灾可以分为四个级别：  数据级容灾：只是将生产站点的数据同步到远端。  与应用结合的数据级容灾：保证对应应用数据一致性。  应用级容灾：需要保证灾难发生以后，需要保证原生成系统中的应用系统在灾备站点可用。  业务级容灾：除了保证数据、应用系统在灾备站点可用，还要保证">
<meta property="og:type" content="article">
<meta property="og:title" content="大话存储，学习笔记（17章），数据容灾">
<meta property="og:url" content="https:&#x2F;&#x2F;duyang2903.gitee.io&#x2F;2019&#x2F;11&#x2F;15&#x2F;%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%8817%E7%AB%A0%EF%BC%89%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%AE%B9%E7%81%BE&#x2F;index.html">
<meta property="og:site_name" content="dy2903的博客">
<meta property="og:description" content="数据容灾 数据备份系统只能保证实际上被安全复制了一份，如果生产系统故障，必须将备份数据尽快的恢复到生产系统中继续生产，就叫容灾。  容灾可以分为四个级别：  数据级容灾：只是将生产站点的数据同步到远端。  与应用结合的数据级容灾：保证对应应用数据一致性。  应用级容灾：需要保证灾难发生以后，需要保证原生成系统中的应用系统在灾备站点可用。  业务级容灾：除了保证数据、应用系统在灾备站点可用，还要保证">
<meta property="og:locale" content="en">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-9fad26a018cc9b07.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-e776d0382b63f776.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-aee32657c991beaf.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-7f11071195f8c22d.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-c8458c7528c7e304.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-bdeed0fdc6bacccd.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-2c9f459895f21276.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-6a3e8eb87f7a3501.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-6c6484d396b37b94.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-d641ede60d0c59d9.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-f1ccd5b392cff340.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-a21c1d7b2e3e807e.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-1e242fcd9f8abb1f.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">
<meta property="og:updated_time" content="2019-11-13T13:27:14.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http:&#x2F;&#x2F;upload-images.jianshu.io&#x2F;upload_images&#x2F;1323506-9fad26a018cc9b07.png?imageMogr2&#x2F;auto-orient&#x2F;strip%7CimageView2&#x2F;2&#x2F;w&#x2F;1240">

<link rel="canonical" href="https://duyang2903.gitee.io/2019/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%8817%E7%AB%A0%EF%BC%89%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%AE%B9%E7%81%BE/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome: false,
    isPost: true,
    isPage: false,
    isArchive: false
  };
</script>

  <title>大话存储，学习笔记（17章），数据容灾 | dy2903的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-meta">

    <div>
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">dy2903的博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
        <p class="site-subtitle">与肝胆人共事，从无字句读书</p>
  </div>

  <div class="site-nav-toggle">
    <div class="toggle" aria-label="Toggle navigation bar">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>
</div>


<nav class="site-nav">
  
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>Home</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>Archives</a>

  </li>
  </ul>

</nav>
</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content">
            

  <div class="posts-expand">
      
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block " lang="en">
    <link itemprop="mainEntityOfPage" href="https://duyang2903.gitee.io/2019/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%8817%E7%AB%A0%EF%BC%89%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%AE%B9%E7%81%BE/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="dy2903">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="dy2903的博客">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          大话存储，学习笔记（17章），数据容灾
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">Posted on</span>

              <time title="Created: 2019-11-15 10:48:24" itemprop="dateCreated datePublished" datetime="2019-11-15T10:48:24+08:00">2019-11-15</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">Edited on</span>
                <time title="Modified: 2019-11-13 21:27:14" itemprop="dateModified" datetime="2019-11-13T21:27:14+08:00">2019-11-13</time>
              </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <h1 id="数据容灾"><a href="#数据容灾" class="headerlink" title="数据容灾"></a>数据容灾</h1><blockquote>
<p>数据备份系统只能保证实际上被安全复制了一份，如果生产系统故障，必须将备份数据尽快的恢复到生产系统中继续生产，就叫<code>容灾</code>。</p>
</blockquote>
<p>容灾可以分为四个级别：</p>
<ul>
<li><p>数据级容灾：只是将生产站点的数据同步到远端。</p>
</li>
<li><p>与应用结合的数据级容灾：保证对应应用数据一致性。</p>
</li>
<li><p>应用级容灾：需要保证灾难发生以后，需要保证原生成系统中的应用系统在灾备站点可用。</p>
</li>
<li><p>业务级容灾：除了保证数据、应用系统在灾备站点可用，还要保证整个企业的业务系统仍对外可用，是最终层次的容灾。</p>
</li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-9fad26a018cc9b07.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>如果要充分保证数据的安全，只是在本地做备份是不够的，所以需要在远程建另一个系统，并包含当前生产系统的全部数据，这个系统须</p>
<ul>
<li><p>要保证主生产系统的数据<strong>实时</strong>的传输到远程备份系统上。</p>
</li>
<li><p>主故障后，必须将应用程序切换到远程备份系统上。</p>
</li>
</ul>
<p>那么备份和容灾有什么区别呢？生产系统就好比手机，备份就是把手机上的数据备份到电脑上，但是如果这个手机坏了呢？要恢复数据需要大量的时间。</p>
<p>那么<code>容灾</code>就是我们有两部手机，而且他们的数据是使用云实时同步的，所以可以<strong>无缝切换</strong>。</p>
<p>如果我们预算充足，可以使用一直两台手机，那还需要<strong>备份</strong>吗？当然需要，比如某个时刻，我们把手机里面的某个联系人给误删了，因为容灾的手机是实时同步的，很难说能通过另一部手机找回来。但是如果之前有备份过数据，完全可以通过之前的备份进行恢复。</p>
<p>下面继续谈<code>容灾</code>。对于一个企业IT生产系统，主要有4个组件：</p>
<ul>
<li><p>生产资料：原始数据</p>
</li>
<li><p>生产工具：服务器等基础架构</p>
</li>
<li><p>生产者：业务应用程序</p>
</li>
<li><p>产品：对外提供的服务信息</p>
</li>
</ul>
<p>下面将对这四大组件的容灾进行讲解</p>
<h2 id="生产资料容灾"><a href="#生产资料容灾" class="headerlink" title="生产资料容灾"></a>生产资料容灾</h2><p>生产资源容灾指的就是对原始数据进行容灾。<strong>这最重要的，因为没有生产资料一切等于从头再来。</strong><br>要设计这样一套生产资料容灾，需要注意的是</p>
<ul>
<li><p>要把变化的<strong>实时</strong>同步到备用系统，方法是</p>
<ul>
<li><p>将某时刻的数据传送到备用系统</p>
</li>
<li><p>将此时候后变化数据同步到备用系统</p>
</li>
<li><p>这样就做了一次同步了，之后只需要在数据变化以后才把变化的数据传送到备用系统。</p>
</li>
</ul>
</li>
<li><p>数据必须至少保留额外一份。在容灾的同时还需要数据备份（避免误删等逻辑错误）</p>
</li>
</ul>
<p>如下为相应的拓扑：</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-e776d0382b63f776.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>主备站点都有相同的生产工具，使用网络相连。可以通过两种方式来进行同步：</p>
<ul>
<li><p>通过前端网络进行同步</p>
</li>
<li><p>通过后端SAN网络进行同步。</p>
</li>
</ul>
<h3 id="通过前端网络同步"><a href="#通过前端网络同步" class="headerlink" title="通过前端网络同步"></a>通过前端网络同步</h3><p><img src="http://upload-images.jianshu.io/upload_images/1323506-aee32657c991beaf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<ul>
<li><p>通过路由器连接到专线或者Internet</p>
</li>
<li><p>变化的数据通过路由器传送到备站点的路由器上。</p>
</li>
<li><p>通过交换机传到备服务器上，写入磁盘阵列</p>
</li>
</ul>
<p>那么到底选择专线还是Internet呢？专线可以保证数据同步的实时性，但是不适合大数量的传输。如果实时性要求不高，而且数据量大的时候，可以将主备站点接入100Mbps的Internet。</p>
<p>可以看出这种方式经过了前端网络，所以必须在每台需要<strong>备份的服务器上安装软件</strong>进行同步，这种软件可以监视目录中的数据变化，然后与远端的软件进行通信，写入相同的文件目录中。</p>
<p>这种方式的同步一般都是<strong>文件级</strong>的同步，对底层卷的数据块变化不做同步。</p>
<h3 id="案例：DB2数据的HADR组件容灾"><a href="#案例：DB2数据的HADR组件容灾" class="headerlink" title="案例：DB2数据的HADR组件容灾"></a>案例：DB2数据的HADR组件容灾</h3><p>DB2数据库利用主备上的数据库软件模块（HADR）来实现两端的数据同步。而且同步的是不卷上的原始数据，而是对数据操作的描述，也就是<strong>日志</strong>。这样的好处是，不需要传输数据，备份机收到日志以后，在备机的磁盘上重做操作即可。</p>
<p><code>HADR:High Availability Disaster Recovery</code>，是数据库级别的高可用性数据复制机制。需要两台数据库服务器：primary , standby</p>
<ul>
<li><p>当<code>主数据库</code>发生事务性操作，将<strong>日志</strong>通过TCP/IP传送到<code>备数据库</code>，然后备机对日志文件进行重放<strong>Replay</strong>，从而保持数据的一致性。</p>
</li>
<li><p>当<code>主数据库</code>故障，备机可以接管主数据库，而客户端应用程序的数据库连接可以通过自动客户端<strong>重新路由</strong>（Automatic Client Reroute）转移到新的主服务器。</p>
</li>
<li><p>当原来的主数据库服务器修复了，作为新的备用数据库加入HADR。</p>
</li>
</ul>
<blockquote>
<p>需要注意的是处于<strong>备用</strong>角色的数据库不能被访问。</p>
</blockquote>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-7f11071195f8c22d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h3 id="通过后端网络实现同步"><a href="#通过后端网络实现同步" class="headerlink" title="通过后端网络实现同步"></a>通过后端网络实现同步</h3><p>通过后端网络进行同步，数据不会流经前端网络，而全部通过后端网络传输到备份的存储上。所以需要将主站点和备站点的后端网络设施连接起来。要么直接拉光纤，要么用专线。</p>
<p>如果用专线的话，需要增加额外的协议转换设备，现在电信部门的光纤专线一般为SDH传输方式，接入到用户端的时候，一般将信号调制成E1、OC3等编码方式。</p>
<p> <img src="http://upload-images.jianshu.io/upload_images/1323506-c8458c7528c7e304.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>上图中，FC协议，经过FCIP网关，变成基于以太网的IP协议，（FC over IP over ETH）。经过E1/以太网转换器，承载到了E1协议上，然后多路E1信号汇聚到光端机，通过一条或者多条光纤，传输给电信部门的SDH交换设施进行传输。</p>
<p>这样我们就将主站点和备站点的后端网络打通了，此时主服务器就可以访问到备份的磁盘阵列，也就是说主站点的服务器可以同时操作<strong>本地磁盘和备站点的磁盘阵列</strong>了。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-bdeed0fdc6bacccd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>我们来看一下这种方式的路径：</p>
<blockquote>
<p>本地磁盘+SAN交换——本地服务器内存——SAN网络交换——电信部门网络——远端SAN网络交换——远端磁盘阵列</p>
</blockquote>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-2c9f459895f21276.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>数据到了远端SAN不需要再经过服务器，<strong>因为有了对方存储设备的直接访问权。</strong>但是整个过程中，仍然至少需要一台<strong>服务器</strong>，服务器上需要安装一个软件，可以将数据从本地卷A提取出来，然后直接通过SAN网络写到位于备份站点的卷B上。</p>
<p>但是试想一下，如果数据直接在内存中生成的，那么同时在A和B上各写一份，速度岂不是更快，这种方式又叫“<code>卷镜像</code>”，因为可以时时刻刻保持两个卷完全相同，它能保证数据同步的实时性，<strong>但是不适合大规模远距离的数据同步</strong>。</p>
<p>同时还需要注意的是，卷镜像的的同步软件工作在卷这一层，可以感知数据块的变化，而不是文件的变化。缺点在于对网络速度要求更高，所以成本也更高。</p>
<h3 id="通过数据存储设备实现同步"><a href="#通过数据存储设备实现同步" class="headerlink" title="通过数据存储设备实现同步"></a>通过数据存储设备实现同步</h3><p>之前讲的通过前端网络和通过后端网络的方式，都使用了一个<code>泵</code>来提供动力。而如果将数据同步软件安装在存储设备上，岂不是更省事。而且这样彻底解放了服务器，所有工作都由磁盘阵列完成。</p>
<p>这种方式的同步，不会识别卷上的文件系统，所以同步的是块。<strong>而且要求主和备的存储设备型号一致。</strong>因为不同厂家的产品无法实现直接同步。<br><img src="http://upload-images.jianshu.io/upload_images/1323506-6a3e8eb87f7a3501.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p>这种方法的缺点是不能保证数据对<strong>应用程序</strong>的可用性。</p>
<p>因为存储设备与应用程序之间还有操作系统这一层，操作系统也有自己的缓存机制，所有有可能造成数据的不一致性。</p>
<p>总结：</p>
<ul>
<li><p>使用前端网络进行同步，路径最长，但是成本也最低。</p>
</li>
<li><p>使用后端网络进行同步，实时性强，但是对后端链路要求也高。不适合于数据量多的时候。</p>
</li>
<li><p>使用存储设备直接进行同步，路径最短，不占用服务器。但是仍然不适合于远距离低速链路环境。而且还不能数据对应用程序的可用性。</p>
</li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-6c6484d396b37b94.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="容灾中数据的同步复制和异步复制"><a href="#容灾中数据的同步复制和异步复制" class="headerlink" title="容灾中数据的同步复制和异步复制"></a>容灾中数据的同步复制和异步复制</h2><h3 id="同步复制"><a href="#同步复制" class="headerlink" title="同步复制"></a>同步复制</h3><p>下图是基于存储设备的自主同步环境。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-d641ede60d0c59d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<ul>
<li><p>主向磁盘发出IO请求，向某LBA写入数据，待写数据入缓存，<strong>此时控制器不会给主的HBA驱动程序发送成功</strong></p>
</li>
<li><p>主磁盘阵列将变化的数据从缓存中写入LUN A，<strong>此时主的数据同步引擎感知</strong>，将变化的数据块从缓存中通过SAN交换机发送到备的缓存中。</p>
</li>
<li><p>备磁盘阵列运行的同步引擎接收到数据后，在FC协议隐式的发一个<strong>ACK</strong>或者通过上层显试的发给主站点</p>
</li>
<li><p>主收到应答，向服务器发一个FC协议的隐式<strong>ACK</strong>。服务器上的FC HBA驱动程序探测成功。</p>
<p>  若备站点迟迟未收到数据，则不会返回成功，应用程序会等待。如果此时应用程序使用的是<strong>同步IO</strong>，则相关进程会挂起，称为<code>IO等待。</code></p>
<p>  <strong>所以同步复制的特点是主站点必须等待备份站点的成功信号，保持严格的同步，一荣俱荣，一损俱损。</strong></p>
</li>
</ul>
<h3 id="异步复制"><a href="#异步复制" class="headerlink" title="异步复制"></a>异步复制</h3><p>相对于同步复制，两边的步调不需要一致，要保证重要的事情先做完，所以会存在一定的数据不一致。</p>
<ul>
<li><p>主向磁盘发出IO请求，待写数据进入<strong>控制器缓存</strong>，如果此时</p>
<ul>
<li><p>主控制器设置为Write Back模式：则立刻返回应答。</p>
</li>
<li><p>主控制器设置为Write Through模式，则先写入LUN A以后，再返回ACK。</p>
</li>
</ul>
</li>
<li><p>主站点将数据通过SAN网络发送到备站点的缓存。</p>
</li>
<li><p>备站点磁盘成功接收，则返回成功。</p>
</li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-f1ccd5b392cff340.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-a21c1d7b2e3e807e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>
<h2 id="生产者容灾——应用程序容灾"><a href="#生产者容灾——应用程序容灾" class="headerlink" title="生产者容灾——应用程序容灾"></a>生产者容灾——应用程序容灾</h2><p>之前讲的都是生产资料的容灾，也就是整个系统最重要的数据的容灾。而对于生产者，无疑就是服务器上的应用程序，如果主发生故障，需要<strong>在备站点重新运行这些应用程序</strong>。最直观的想法是，在备站点预备应用程序的安装文件，一定主出现故障，在备上配置这些应用程序，但是实际上应用程序安装和配置需要大量的时间。所以<strong>可以将备份站点预装应用程序，但是不工作，这样就可保证同一时刻整个IT系统只有一个站点的生产者处理一份数据</strong></p>
<p>既要求处理同一份数据，又要求发生事故的时候，备份站点的生产者立即启动，要做到这点，需要让备份站点的应用程序感知到主站点的应用程序状态，一旦发现故障，立即启动开始生产。</p>
<p>在之前的章节中，我们说到了<strong>高可用群集</strong>，在容灾系统领域，群集的范围扩大到了异地，主备可能相隔很远，交换运行状态的数据量很小，最好使用专线，这样可以很好的保证QoS。</p>
<p>传统的HA软件是使用<strong>共享存储</strong>的方式来作用的，即在HA系统中，共享一份物理存储，不管谁来操作这份数据，最终只有一份，而且是一致，有上下文逻辑关系的。</p>
<p>所以HA软件是基于资源切换的，把组件看作是资源，比如应用、IP地址、存储卷等。<br>当故障时，</p>
<ul>
<li><p><strong>备份机</strong>HA软件会检测到对方的故障，</p>
</li>
<li><p>然后强行将资源迁移到本地，比如在备份机上修改网卡的IP地址，并发出ARP广播来刷新所有广播域的客户端以及网关的ARP记录</p>
</li>
<li><p>挂载共享存储设备上的卷，</p>
</li>
<li><p>最后启动备份应用系统。</p>
</li>
</ul>
<p>这样应用系统可以访问共享卷，客户端也可以使用原来的IP地址来访问服务器，这样生产就可以继续下去。</p>
<p>但是在异地容灾系统中，主备站点各有一份数据，所以必须保证数据的同步。这也是为什么<strong>两个站点同时只有一个在工作</strong>，这样的话才能以一边数据为准，另一边与之同步。</p>
<h3 id="本地容灾"><a href="#本地容灾" class="headerlink" title="本地容灾"></a>本地容灾</h3><p>本地HA系统中，多个节点如果共同拥有同一个卷，但是同一时刻只有一个节点能挂载它，这种模式叫<strong>共享存储模式</strong></p>
<p>与之对应的是<strong>Share-Nothing模式</strong>，每个节点都有自己独占的存储卷，怎么进行数据共享呢？可以通过<strong>同步复制技术</strong>同步到所有节点上。若某节点发生故障，这个节点对应的备份节点启动应用程序。因为之前的数据已经同步过了，所以数据一定是一致的。</p>
<p>在Share-Nothing模式下，不存在任何的接管问题，所以客户端需要感知服务端群集这种切换动作，通过客户端进行<strong>配置的切换</strong>即可。</p>
<p>可以对共享存储和Share-Nothing两种存储模式进行对比。</p>
<table>
<thead>
<tr>
<th></th>
<th>共享存储</th>
<th>Share-Nothing</th>
</tr>
</thead>
<tbody><tr>
<td>数据本身是否容灾</td>
<td>×</td>
<td>√</td>
</tr>
<tr>
<td>软硬件成本</td>
<td>高</td>
<td>低</td>
</tr>
<tr>
<td>前端网络资源消耗</td>
<td>低</td>
<td>高</td>
</tr>
<tr>
<td>管理难度</td>
<td>高</td>
<td>低</td>
</tr>
<tr>
<td>维护数据是否需要停机</td>
<td>√</td>
<td>×</td>
</tr>
<tr>
<td>实现的复杂度</td>
<td>高</td>
<td>低</td>
</tr>
<tr>
<td>是否需要第三方软件</td>
<td>√</td>
<td>×</td>
</tr>
<tr>
<td>故障因素数量</td>
<td>3个</td>
<td>2个</td>
</tr>
</tbody></table>
<ul>
<li><p>数据本身是否容灾</p>
<ul>
<li><p>共享存储：数据损坏，必须使用镜像进行还原。而且要停机。</p>
</li>
<li><p>Share-Nothing：每个节点都有自己的数据拷贝，若损坏，可切换到另外的节点，不影响应用，不停机。修复后的节点可以重新加入容灾系统。</p>
</li>
</ul>
</li>
<li><p>软硬成本</p>
<ul>
<li><p>共享：需要外接磁盘阵列，为了保证数据访问速度，必须自身实现RAID，主机也需要安装适配器。成本高。需要HA软件</p>
</li>
<li><p>Share-Nothing:各个节点各自保存数据，不需要外接存储系统，不需要额外的HA软件</p>
</li>
</ul>
</li>
<li><p>前端网络耗费</p>
<ul>
<li><p>共享存储：前端只需要交互控制信息，资源耗费较小。</p>
</li>
<li><p>Share-Nothing:数据同步靠前端，对资源消耗很大。</p>
</li>
</ul>
</li>
<li><p>管理难度：</p>
<ul>
<li><p>共享：需要管理节点间的交互配置，还需要管理外部存储，增加了管理难度</p>
</li>
<li><p>Share-Nothing:只需要管理节点配置。</p>
</li>
</ul>
</li>
<li><p>是否停机</p>
<ul>
<li><p>共享：需要将数据从单机转移到共享存储供其他节点使用，需要停机来保证一致性。</p>
</li>
<li><p>Share-Nothing：数据同步是动态的，不需要停机。</p>
</li>
</ul>
</li>
<li><p>实现复杂度</p>
<ul>
<li><p>共享存储：有三种基本元素：节点、节点间的交互、共享数据。如果使用共享存储模式做容灾，需要将数据移动到共享存储上，增加额外的工作量和不可控因素</p>
</li>
<li><p>Share-Nothing：只有两种元素 节点&amp;节点交互</p>
</li>
</ul>
</li>
<li><p>第三方</p>
<ul>
<li><p>共享存储：备份节点需要通过HA软件来监控主节点的状态，发生故障的时候自动接管，如MSCS</p>
</li>
<li><p>share-Nothing：不需要第三方软件参与</p>
</li>
</ul>
</li>
<li><p>故障因素</p>
<ul>
<li><p>共享存储：OS、应用程序、HA软件</p>
</li>
<li><p>Share-nothing：OS、应用程序</p>
</li>
</ul>
</li>
</ul>
<h3 id="异地容灾"><a href="#异地容灾" class="headerlink" title="异地容灾"></a>异地容灾</h3><p>如果主站点和备站点不在同一个机房中，这样备份应用程序需要跨越很远的距离来与主程序交互状态。只是说这种交互包很小，不需要担心延时的问题。</p>
<h4 id="IP切换"><a href="#IP切换" class="headerlink" title="IP切换"></a>IP切换</h4><p>在<strong>异地容灾系统</strong>，主服务器和备服务器<strong>不大可能在同一个广播域</strong>，所以需要通过网关来转发IP包，正因为此不能用<strong>资源切换</strong>的方式来切换IP地址。</p>
<p>如果想故障后，客户端继续使用原来的IP地址连接<strong>备份服务器</strong>，那么可以在<strong>路由</strong>上做文章。动态修改路由器上的路由表，将IP包路由到备份站点而不是主站点。如果利用域名来访问服务器，那么可以直接在DNS设备上修改IP指向记录来实现。</p>
<h4 id="卷切换"><a href="#卷切换" class="headerlink" title="卷切换"></a>卷切换</h4><p>异地容灾系统在主站点和备站点各有卷，两个卷通过前端或者后端网络进行同步。</p>
<p>如果备的HA软件检测到主站点通信失败，通过某种方式，断开<strong>同步</strong>关系（若不断开，卷会被锁定而不可访问）。然后就是重新挂载备站点的卷</p>
<p>此时同步引擎可以是运行在存储设备上，也可以由HA来执行。</p>
<ul>
<li><p>如果同步引擎是运行<strong>在存储设备</strong>上的，必须由管理员手动利用存储设备的配置工具来断开同步关系。断开了以后，本地的卷才可以被访问，然后HA软件可以在备份机上调用操作系统相关功能来挂载这个卷。</p>
</li>
<li><p>如果同步引擎本来就是<strong>HA来执行</strong>的，那么HA软件可以自动断开同步关系，在备份机上挂载对应的卷。</p>
</li>
</ul>
<h4 id="异地容灾的应用切换"><a href="#异地容灾的应用切换" class="headerlink" title="异地容灾的应用切换"></a>异地容灾的应用切换</h4><p>应用，也就是生产者的切换，是所有HA容灾系统在故障发生后所执行的最后一步。与共享存储式的HA容灾一样，异地容灾的应用切换，是有备机的HA软件来执行<strong>脚本</strong>，或者调用相应的<strong>接口</strong>来启动备份机的应用的。</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1323506-1e242fcd9f8abb1f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png"></p>

    </div>

    
    
    

      <footer class="post-footer">

        

          <div class="post-nav">
            <div class="post-nav-next post-nav-item">
                <a href="/2019/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%886%E7%AB%A0%EF%BC%89%EF%BC%8C-%E7%A3%81%E7%9B%98%E9%98%B5%E5%88%97/" rel="next" title="大话存储，学习笔记（6章），-磁盘阵列">
                  <i class="fa fa-chevron-left"></i> 大话存储，学习笔记（6章），-磁盘阵列
                </a>
            </div>

            <span class="post-nav-divider"></span>

            <div class="post-nav-prev post-nav-item">
                <a href="/2019/11/15/%E5%A4%A7%E8%AF%9D%E5%AD%98%E5%82%A8%EF%BC%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%8818%E7%AB%A0%EF%BC%89%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%89%8D%E5%A4%84%E7%90%86%E5%92%8C%E5%90%8E%E5%A4%84%E7%90%86/" rel="prev" title="大话存储，学习笔记（18章），数据前处理和后处理">
                  大话存储，学习笔记（18章），数据前处理和后处理 <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
      </footer>
    
  </article>
  
  
  

  </div>


          </div>
          

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          Table of Contents
        </li>
        <li class="sidebar-nav-overview">
          Overview
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#数据容灾"><span class="nav-number">1.</span> <span class="nav-text">数据容灾</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#概述"><span class="nav-number">1.1.</span> <span class="nav-text">概述</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#生产资料容灾"><span class="nav-number">1.2.</span> <span class="nav-text">生产资料容灾</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#通过前端网络同步"><span class="nav-number">1.2.1.</span> <span class="nav-text">通过前端网络同步</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#案例：DB2数据的HADR组件容灾"><span class="nav-number">1.2.2.</span> <span class="nav-text">案例：DB2数据的HADR组件容灾</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#通过后端网络实现同步"><span class="nav-number">1.2.3.</span> <span class="nav-text">通过后端网络实现同步</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#通过数据存储设备实现同步"><span class="nav-number">1.2.4.</span> <span class="nav-text">通过数据存储设备实现同步</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#容灾中数据的同步复制和异步复制"><span class="nav-number">1.3.</span> <span class="nav-text">容灾中数据的同步复制和异步复制</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#同步复制"><span class="nav-number">1.3.1.</span> <span class="nav-text">同步复制</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#异步复制"><span class="nav-number">1.3.2.</span> <span class="nav-text">异步复制</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#生产者容灾——应用程序容灾"><span class="nav-number">1.4.</span> <span class="nav-text">生产者容灾——应用程序容灾</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#本地容灾"><span class="nav-number">1.4.1.</span> <span class="nav-text">本地容灾</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#异地容灾"><span class="nav-number">1.4.2.</span> <span class="nav-text">异地容灾</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#IP切换"><span class="nav-number">1.4.2.1.</span> <span class="nav-text">IP切换</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#卷切换"><span class="nav-number">1.4.2.2.</span> <span class="nav-text">卷切换</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#异地容灾的应用切换"><span class="nav-number">1.4.2.3.</span> <span class="nav-text">异地容灾的应用切换</span></a></li></ol></li></ol></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">dy2903</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">20</span>
          <span class="site-state-item-name">posts</span>
        </a>
      </div>
      <div class="site-state-item site-state-tags">
        <span class="site-state-item-count">2</span>
        <span class="site-state-item-name">tags</span>
      </div>
  </nav>
</div>
  <div class="feed-link motion-element">
    <a href="/atom.xml" rel="alternate">
      <i class="fa fa-rss"></i>RSS
    </a>
  </div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">dy2903</span>
</div>
  <div class="powered-by">Powered by <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> v4.0.0
  </div>
  <span class="post-meta-divider">|</span>
  <div class="theme-info">Theme – <a href="https://pisces.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Pisces</a> v7.5.0
  </div>

        












        
      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script><script src="/js/motion.js"></script>
<script src="/js/schemes/pisces.js"></script>
<script src="/js/next-boot.js"></script>



  
















  

  

</body>
</html>
